package com.chushouya.order.rabbitmq.listener;

import com.general.framework.core.exception.BaseException;
import com.general.framework.core.exception.ViolationException;
import com.chushouya.common.dto.QueueMessage;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
@Slf4j
public class OrderMessageListener {

    @Resource
    private ObjectMapper objectMapper;

    /**
     * 监听订单创建消息
     */
    @RabbitListener(queuesToDeclare = @Queue(name = "chushouya.order.created", durable = "true"))
    public void handleOrderCreatedMq(QueueMessage<?> queueMessage) {
        try {
            log.info("收到订单创建消息: messageId={}, data={}", queueMessage.getMessageId(), queueMessage.getData());
            
            // 验证消息数据
            if (queueMessage.getData() == null) {
                log.error("订单创建消息数据为空: messageId={}", queueMessage.getMessageId());
                log.warn("数据为空的消息已处理，避免重复处理: messageId={}", queueMessage.getMessageId());
                return;
            }
            
            // 处理订单创建消息
            processMessage(queueMessage.getMessageId(), queueMessage.getMessageType(), queueMessage.getData(), queueMessage.getCreateTime());
            
            log.info("订单创建消息处理完成: messageId={}", queueMessage.getMessageId());
            
        } catch (ViolationException e) {
            log.error("订单创建消息验证错误: {}, messageId: {}", e.getMessage(), queueMessage.getMessageId());
            // 验证异常不抛出，避免消息重新入队
            log.warn("验证异常消息已处理，避免重复处理: messageId={}", queueMessage.getMessageId());
        } catch (BaseException e) {
            log.error("订单创建消息业务异常: {}, messageId: {}", e.getMessage(), queueMessage.getMessageId());
            // 业务异常不抛出，避免消息重新入队
            log.warn("业务异常消息已处理，避免重复处理: messageId={}", queueMessage.getMessageId());
        } catch (Exception e) {
            log.error("处理订单创建消息异常: {}, messageId: {}", e.getMessage(), queueMessage.getMessageId(), e);
            // 其他异常不抛出，避免消息重新入队
            log.warn("异常消息已处理，避免重复处理: messageId={}", queueMessage.getMessageId());
        }
    }

    /**
     * 处理解析后的消息
     */
    private void processMessage(String messageId, String messageType, Object data, String createTime) {
        log.info("Processing message - ID: {}, Type: {}, Data: {}, CreateTime: {}", 
                messageId, messageType, data, createTime);
        
        // 根据消息类型处理不同的业务逻辑
        if ("ORDER_CREATED".equals(messageType)) {
            // 处理订单创建消息
            Long orderId = data instanceof Long ? (Long) data : Long.valueOf(data.toString());
            log.info("处理订单创建消息: orderId={}", orderId);
            // TODO: 在这里添加具体的业务逻辑
            
        } else if ("ORDER_TIMEOUT_CHECK".equals(messageType)) {
            // 处理订单超时检查消息
            Long orderId = data instanceof Long ? (Long) data : Long.valueOf(data.toString());
            log.info("处理订单超时检查消息: orderId={}", orderId);
            // TODO: 在这里添加订单超时检查逻辑
            
        } else {
            // 处理其他类型的消息（无类型或未知类型）
            log.info("处理通用消息: data={}", data);
            // TODO: 在这里添加通用消息处理逻辑
        }
        
        log.info("Message processed successfully - ID: {}", messageId);
    }
}
